// 一些公共方法
import store from '@/store/index'
import cache from '@/cache'
import {MessageBox} from 'element-ui'
import userApi from '@/api/auth/userApi'
import router from '@/router'

function Dict(dict) {
  this.enum = dict
  this.list = Object.values(dict)
  let map = {}
  this.list.forEach(e => {
    map[e.value] = e.label
  })
  this.map = map
}

// 是否重新登陆,解决重新登陆弹窗过多的问题
let isRelogin = {show: false}

export default {
  dict(dict) {
    return new Dict(dict)
  },
  // 去除对象中的无效属性
  formatObj(obj) {
    Object.keys(obj).forEach(e => {
      if (obj[e] === null  || obj[e] === undefined || obj[e] === NaN) {
        delete obj[e]
      }
    })
    return obj
  },
  // 获取18位伪随机ID
  guid() {
    return 'xxxxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
      var r = Math.random() * 16 | 0,
        v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
    });
  },
  //判断输入的值是否是自然数
  isNaturalNum(value) {
    let numReg = /^(([1-9][0-9]+)|[0-9])$/
    return numReg.test(value)
  },
  // 退出登陆的方法
  logout(message = '确定退出登陆?') {
    if (isRelogin.show)
      return
    isRelogin.show = true
    MessageBox.confirm(message, {
      title: '提示',
      type: 'warning',
      iconClass: 'el-icon-warning',
      showClose: true,
      lockScroll: true,
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      callback: action => {
        if (action === 'confirm') {
          userApi.logout().then(_ => {
          }).finally(_ => {
            // 退出成功，清除本地数据
            cache.clearAll()
            // 回到登录页面，重新登录
            window.location.href = '/'
          })
        }else{
          isRelogin.show = false
        }
      }
    })
  },
  // 将字符串转成snake_case的格式
  /**
   *  蛇形命名法,具体的规则是全部由小写字母构成,每个单词之间用下划线分割.
   *  传入的字符串中仅可包含大小写字母,数字,以及分隔符(包括'_','-',' ')
   */
  to_snake_case(str) {
    let SEPARATOR = '_'
    let checkReg = /^[A-Za-z-_ ]*$/
    // 如果不是字符串或含有特殊字符,那么报错
    if (typeof str !== 'string' && !checkReg.test(str)) {
      return null
    }
    // 空的字符串直接返回空即可
    if (!str.length) {
      return ''
    }
    // 将大写字母前端缀上'_'并转小写
    let res = str.replace(/([A-Z])/g, `${SEPARATOR}$1`).toLowerCase()
    // 将其他的分隔符统一转换为_,注意可能会有一些连续的分隔符,就删减为一个
    res = res.replace(/[-_ ]+/g, `${SEPARATOR}`)
    // 如果首位面有分隔符,那么需要去掉
    if (res[0] === SEPARATOR) {
      res = res.slice(1)
    }
    return res
  },
  /**
   * 添加一个头节点,可以实现以下两个功能:
   * 树结构添加最上级,例如[{name: 'X',id: 'XXX',children: []},{name: 'X',id: 'XXX',children: []}]改造为[name: '添加的头部',id: 'XXX',children: [{name: 'X',id: 'XXX',children: []},{name: 'X',id: 'XXX',children: []}]];
   * 数组添加最顶部的空节点,例如[{name: 'X',id: 'XXX'},{name: 'X',id: 'XXX',}]改造为[{name: '添加的空节点',id: 'XXX'},{name: 'X',id: 'XXX'},{name: 'X',id: 'XXX',}]
   * @param {array} data  - 源数据 可以是一个列表,也可以是个树
   * @param {boolean=} [isTree = true ] - 源数据是否是树,默认为true
   * @param {string=} [children = 'children'] - 当源数据是树时,源数据作为组装后对象的某个属性,该属性用于定义属性名,仅headerProps.isTree为true时生效
   * @param {Object=} [content = {id: '0', name: '头部'}] - 头部的属性
   * @return {array=} res 封装后的数据
   */
  addHeader(data, {isTree = true, children = 'children', content = {id: '0', name: '头部'}} = {}) {
    // 不论是树还是数组,都是数组的格式
    if (Array.isArray(data)) {
      let header = {...content}
      if (isTree) {
        header[children] = data
        data = [header]
      } else {
        data.unshift(header)
      }
      return data
    } else {
      throw new Error('传入的格式错误')
    }
  }
}
